package com.bird.设计模式.创建型.单例模式.懒汉单例;

/**
 * @data 2022/2/24 19:15
 * @author: bird
 * @description: 单例-静态内部类：
 * -- 基于类初始化的延迟加载解决方案
 */
public class StaticInnerClassSingleton {

    // 静态内部类 私有的防止外部创建
    private static class InnerClass {
        private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
    }


    // 获取类的实例
    public static StaticInnerClassSingleton getInstance() {
        return InnerClass.staticInnerClassSingleton;
    }

    // 私有的构造器 防止外部创建
    private StaticInnerClassSingleton(){
        // 加上这段代码 防止反射创建出类新的实例
        if(InnerClass.staticInnerClassSingleton!=null){
            throw  new RuntimeException("单例构造器禁止反射调用");
        }

    }

}

/*
* 静态-内部类的原理：
* jvm在类的初始化阶段(就是class被加载后，并且在线程访问之前 都是类的初始化阶段)。
* 在这个阶段会执行类的初始化 在初始化期间jvm会获取一个锁(叫做Class对象的初始化锁)
* 这个锁可以同步多个线程对一个类的初始化。
* 基于这个特性 可以实现基于内部类并且是线程安全的延迟出初始化方案。
*
* 简单的来说：静态内部类的延迟加载实例化的原理是
* 有个Class对象的初始化锁,多个线程在执行静态类的实例化的时候 需要先拿到这把锁 然后执行后面的逻辑。
* 所以静态内部类 就是基于类的延迟初始化加载而设计的方案。
*
*
* */
